package com.zjsru.plan2024.oneday;

/**
 * 3001. 捕获黑皇后需要的最少移动次数
 *
 * @Author: cookLee
 * @Date: 2024-12-05
 */
public class MinMovesToCaptureTheQueen {

    /**
     * 主
     * \
     * 给你 6 个整数 a 、b 、c 、d 、e 和 f ，其中：
     * <p>
     * (a, b) 表示白色车的位置。
     * (c, d) 表示白色象的位置。
     * (e, f) 表示黑皇后的位置。
     * \
     * 车可以向垂直或水平方向移动任意数量的格子，但不能跳过其他棋子。
     * 象可以沿对角线方向移动任意数量的格子，但不能跳过其他棋子。
     * 如果车或象能移向皇后所在的格子，则认为它们可以捕获皇后。
     * 皇后不能移动。
     * \
     * 输入：a = 1, b = 1, c = 8, d = 8, e = 2, f = 3
     * 输出：2
     * 解释：将白色车先移动到 (1, 3) ，然后移动到 (2, 3) 来捕获黑皇后，共需移动 2 次。
     * 由于起始时没有任何棋子正在攻击黑皇后，要想捕获黑皇后，移动次数不可能少于 2 次。
     * \
     * 输入：a = 5, b = 3, c = 3, d = 4, e = 5, f = 2
     * 输出：1
     * 解释：可以通过以下任一方式移动 1 次捕获黑皇后：
     * - 将白色车移动到 (5, 2) 。
     * - 将白色象移动到 (5, 2) 。
     * \
     *
     * @param args args
     */
    public static void main(String[] args) {
        MinMovesToCaptureTheQueen minMovesToCaptureTheQueen = new MinMovesToCaptureTheQueen();
        System.out.println(minMovesToCaptureTheQueen.minMovesToCaptureTheQueen(7, 8, 7, 7, 7, 3));
    }

    /**
     * 分类讨论
     *
     * @param a a
     * @param b b
     * @param c c
     * @param d d
     * @param e e
     * @param f f
     * @return int
     */
    public int minMovesToCaptureTheQueen(int a, int b, int c, int d, int e, int f) {
        //车和皇后在同一行且没有象挡路
        if (a == e && (c != a || d <= Math.min(b, f) || d >= Math.max(b, f))) {
            return 1;
        }
        //车和皇后在同一列且没有象挡路
        if (b == f && (d != b || c <= Math.min(a, e) || c >= Math.max(a, e))) {
            return 1;
        }
        //象和皇后在统一对角线且没有车
        if (Math.abs(c - e) == Math.abs(d - f)) {
            //皇后，车，象在同一对角线且在中间，斜率相同，但是只要移动一次即可
            //保证斜率不同即可说明不在同一对角线内 (c - e) / (d - f) != (a - e) / (b - f) ===> (c - e) * (b - f) != (a - e) * (d - f)
            if (a < Math.min(c, e) || a > Math.max(c, e) || (c - e) * (b - f) != (a - e) * (d - f)) {
                return 1;
            }
        }
        //因为车和象的特性，最多两次可以捕获皇后
        return 2;
    }

}
